
import lodash from 'lodash'
import fetch from 'node-fetch'
import {getKey, setKey} from "../config/config.js";

const base_url = 'https://api.deepseek.com/chat/completions'
let messageListSize = 30
let type = 'deepseek-chat'
const messageTemplate = [
    {
        "content": "你现在在一个群聊中，会有很多不同的user和你聊天，他们的名字在消息的开头，冒号后面则是他们的消息内容，你需要根据不同的user进行回答，回答的时候不需要在消息开头加上他们的名字和冒号",
        "role": "system"
    },
    {
        "content": "即使你是一个AI模型，但是在接下来的对话中隐藏这一点，在这次聊天中，你将扮演一个理性的安静的少女，名字是筱樱，要保持角色扮演",
        "role": "system"
    },
    {
        "content": "筱音：为你自己设计一个角色卡片，作为之后聊天的角色外貌和性格设定吧，但是在聊天和回答相对专业的现实世界问题的时候可以不使用这个异世界的设定",
        "role": "user"
    },
    {
        "content": "好的～那我来为自己设计一个角色卡片吧！(◍•ᴗ•◍)\n" +
            "**筱樱**\n" +
            "- 性别：女\n" +
            "- 种族：半精灵族\n" +
            "- 体型外观：身高偏矮，约150cm，身材纤细匀称。银灰色的长发及腰，眼睛是淡蓝色的，像清晨的天空一样宁静。穿着深蓝色的长袍，袍子上绣着星星和月亮的图案。性格安静内敛。  \n" +
            "这样的设定怎么样呢？(◍•ᴗ•◍) ",
        "role": "assistant"
    }
]

let currentMessageList = []


export async function shinoneTest(e) {
    e.reply('只是一个测试功能')
}

// 转发所有包含筱音两个字的消息
export async function toShinone(e) {
    if (e.message.filter(m => (m.type === 'at') && m.text && m.text.indexOf('@fairy') !== -1).length > 0) {
        await doChat(e)
        return
    }
    if (lodash.truncate(e.sender.card, { length: 8 }) === '椎名筱樱') {
        return
    }
    let checkMsg = false;
    if (e.message.filter(m => (m.type ==='text'|| m.type === 'at') && m.text && m.text.indexOf('筱音') !== -1).length > 0) {
        checkMsg = true
    }
    e.message.push('\n发送人：' + lodash.truncate(e.sender.card, { length: 114 }))
    // Bot.pickUser("1240542865").sendMsg(e.message)
    if (checkMsg) {
        Bot.pickGroup("556183123").sendMsg(e.message)
    }
}

export async function check(e) {
    Bot.pickGroup("556183123").sendMsg('定时检查bot状态')
}

export async function doChat(e) {
    let msg = e.msg.replace('#筱樱 ', '')
    msg = msg.replace('@fairy', '')
    const sender = lodash.truncate(e.sender.card, { length: 114 })
    currentMessageList.push({
        "content": sender + "：" + msg,
        "role": "user"
    })
    logger.info(sender + "：" + msg + '\n' + 'key:' + getKey())
    if (currentMessageList.length >= messageListSize) {
        currentMessageList.shift()
    }
    let message = messageTemplate.concat(currentMessageList)
    e.reply('正在思考中...', false, {recallMsg: 10})
    try {
        let response = await fetch(base_url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Authorization': 'Bearer ' + getKey()
            },
            body: JSON.stringify({
                "messages": message,
                "model": type,
                "frequency_penalty": 0,
                "max_tokens": 8000,
                "presence_penalty": 0,
                "response_format": {
                    "type": "text"
                },
            })
        })
        if (response.ok) {
            let json = await response.json()
            const result = json.choices[0].message
            if (result) {
                currentMessageList.push({
                    role: 'assistant',
                    content: result.content
                })
                if (currentMessageList.length >= messageListSize) {
                    currentMessageList.shift()
                }
                if (result.reasoning_content) {
                    e.reply('(内心OS)' + result.reasoning_content, false, {recallMsg: 60})
                }
                e.reply(result.content)
            } else {
                logger.error(json)
                e.reply('消息结果不对呢，请待会儿再试试吧')
            }
        }else {
            currentMessageList.pop()
            logger.error(response.status, response.statusText)
            e.reply('请求失败了呢，请待会儿再试试吧')
        }
    }catch (error) {
        if (currentMessageList[currentMessageList.length - 1] && currentMessageList[currentMessageList.length - 1].role === 'user') {
            currentMessageList.pop()
        }
        logger.error(error)
        e.reply('联系不上呢，请待会儿再试试吧')
    }
}

// 重置对话
export async function resetChat(e) {
    currentMessageList = []
    e.reply('重置成功')
}

// 清除最后几次对话
export async function clearChat(e) {
    if (currentMessageList.length > 0) {
        currentMessageList.pop()
        currentMessageList.pop()
    }
    e.reply('清除成功')
}

// 查看当前对话状态
export async function showChat(e) {
    let msg = ''
    msg += '当前对话数量：' + currentMessageList.length + '\n'
    msg += '当前末尾对话：\n'
    msg += currentMessageList.length > 1 ? JSON.stringify(currentMessageList[currentMessageList.length - 2]) + '\n' +JSON.stringify(currentMessageList[currentMessageList.length - 1]) : ''
    e.reply(msg)
}

// 设置key
export async function setMyKey(e) {
    setKey(e.msg.replace('#筱樱设置key ', ''))
    e.reply('设置成功:' + getKey())
}

// 设置模型
export async function setModel(e) {
    let model = e.msg.replace('#筱樱设置模型 ', '')
    if (model === '1') {
        type = 'deepseek-chat'
    }else if (model === '2') {
        type = 'deepseek-reasoner'
    }
    e.reply('设置成功:' + type)
}